package com.hotel.service.impl;

import com.hotel.component.IocContainer;
import com.hotel.dao.RoomDao;
import com.hotel.entity.PageBean;
import com.hotel.entity.Room;
import com.hotel.exception.EntityException;
import com.hotel.service.RoomService;
import com.hotel.utils.JdbcUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * @Author Str
 * @Date 2021/11/1 21:07
 * @Description :
 */
public class RoomServiceImpl implements RoomService {

    private RoomDao roomDao = (RoomDao) IocContainer.getBean("RoomDao");

    @Override
    public List<Room> getRooms() throws SQLException {
        return roomDao.getRooms();
    }

    @Override
    public void save(Room room) throws EntityException, SQLException {
        //{ps}这里要同时处理两件事情 [新增 / 更新]
        //{1}获取数据库连接.
        Connection conn = JdbcUtils.getConnection();
        //{2}开启事务功能 [自动提交关闭]
        conn.setAutoCommit(false);
        try {
            //{3}如果 userID 为空 ----> 新增用户
            if (room.getId() == null) {
                //{a}查询用户是否存在
                Room find = roomDao.getRoomByRoomNo(room.getRoomNo());
                //{b}如果用户存在, 不能新增用户
                if (find != null) {
                    throw new EntityException("用户已存在。");
                }

                //{b}设置id
                room.setId("r"+room.getRoomNo());
//                System.out.println("Service:::"+user);
                //{c}新增用户
                roomDao.addRoom(room);
            } else {    //不为空 ---> 更新用户
                roomDao.updateRoom(room);
            }
            //{4}提交事务
            conn.commit();
        } finally {
            conn.close();
        }
    }

    @Override
    public Room getById(String id) throws SQLException, EntityException {
        Room room = roomDao.getRoomById(id);
        return room;
    }

    @Override
    public PageBean<Room> getList(Map<String, Object> map) throws SQLException {
        //{1}从 map 中获取 page, limit。
        Integer page = (Integer) map.get("page");
        Integer limit = (Integer) map.get("limit");
        //{2}查询结果记录偏移量
        int offset = (page - 1) * limit;
        //{3}再将它们从 map 中移除。
        map.remove("page");
        map.remove("limit");
        //{4}创建 PageBean
        PageBean<Room> pBean = new PageBean<>();
//        try{
        //{5}获取搜索关键字的 SQL 片段
        String schSQL = roomDao.getSearchSQL(map);
        //{6}获取当前查询到的记录数。
        int count = roomDao.getCount(schSQL);
        //{7}获取当前查询到的记录数据。
        List<Room> list = roomDao.getList(schSQL, offset, limit);
        //{8}设置记录数
        pBean.setCount(count);
        //{9}设置 列表数据
        pBean.setList(list);
//        }finally{
//            //{ps}关闭连接。
//            JdbcUtils.closeConnection();
//        }
        return pBean;
    }

    @Override
    public void delete(String id) throws SQLException, EntityException {
        //{1}获取数据库连接.
        Connection conn = JdbcUtils.getConnection();
        //{2}开启事务功能 [自动提交关闭]
        conn.setAutoCommit(false);
        try {
            int ret = roomDao.deleteRoom(id);
            if (ret != 1) {
                throw new EntityException("删除失败。");
            }
            //{4}提交事务
            conn.commit();
        } finally {
            conn.close();
        }
    }
}
